Index: sites/all/modules/feeds/plugins/FeedsParser.inc
===================================================================
--- sites/all/modules/feeds/plugins/FeedsParser.inc	(revision 4030)
+++ sites/all/modules/feeds/plugins/FeedsParser.inc	(working copy)
@@ -85,7 +85,7 @@
       return $node->uid;
     }
     $item = $batch->currentItem();
-    return isset($item[$element_key]) ? $item[$element_key] : '';
+    return !empty($item[$element_key]) ? $item[$element_key] : NULL;
   }
 }
 
Index: sites/all/modules/feeds/plugins/FeedsProcessor.inc
===================================================================
--- sites/all/modules/feeds/plugins/FeedsProcessor.inc	(revision 4030)
+++ sites/all/modules/feeds/plugins/FeedsProcessor.inc	(working copy)
@@ -97,25 +97,6 @@
       $target_item = array();
     }
 
-    // Many mappers add to existing fields rather than replacing them. Hence we
-    // need to clear target elements of each item before mapping in case we are
-    // mapping on a prepopulated item such as an existing node.
-    $convert_to_array = FALSE;
-    if (is_array($target_item)) {
-      $target_item = (object)$target_item;
-      $convert_to_array = TRUE;
-    }
-    foreach ($this->config['mappings'] as $mapping) {
-      if (isset($targets[$mapping['target']]['real_target'])) {
-        unset($target_item->{$targets[$mapping['target']]['real_target']});
-      }
-      elseif (isset($target_item->{$mapping['target']})) {
-        unset($target_item->{$mapping['target']});
-      }
-    }
-    if ($convert_to_array) {
-      $target_item = (array)$target_item;
-    }
 
     /*
     This is where the actual mapping happens: For every mapping we envoke
@@ -139,16 +120,39 @@
         $value = $parser->getSourceElement($batch, $mapping['source']);
       }
 
-      // Map the source element's value to the target.
-      if (is_array($targets[$this->id][$mapping['target']]) &&
-          isset($targets[$this->id][$mapping['target']]['callback']) &&
-          function_exists($targets[$this->id][$mapping['target']]['callback'])) {
-        $callback = $targets[$this->id][$mapping['target']]['callback'];
-        $callback($target_item, $mapping['target'], $value);
+      if (isset($value)) {  // only if a column was present in the feed 
+      
+        // Many mappers add to existing fields rather than replacing them. Hence we
+        // need to clear target elements of each item before mapping in case we are
+        // mapping on a prepopulated item such as an existing node.
+        $convert_to_array = FALSE;
+        if (is_array($target_item)) {
+          $target_item = (object)$target_item;
+          $convert_to_array = TRUE;
+        }
+
+        if (isset($targets[$mapping['target']]['real_target'])) {
+          unset($target_item->{$targets[$mapping['target']]['real_target']});
+        }
+        elseif (isset($target_item->{$mapping['target']})) {
+          unset($target_item->{$mapping['target']});
+        }
+
+        if ($convert_to_array) {
+          $target_item = (array)$target_item;
+        }
+
+        // Map the source element's value to the target.
+        if (is_array($targets[$this->id][$mapping['target']]) &&
+            isset($targets[$this->id][$mapping['target']]['callback']) &&
+            function_exists($targets[$this->id][$mapping['target']]['callback'])) {
+          $callback = $targets[$this->id][$mapping['target']]['callback'];
+          $callback($target_item, $mapping['target'], $value);
+        }
+        else {
+          $this->setTargetElement($target_item, $mapping['target'], $value);
+        }
       }
-      else {
-        $this->setTargetElement($target_item, $mapping['target'], $value);
-      }
     }
     return $target_item;
   }
